草庐IT

C++ STL : Custom sorting one vector based on contents of another

全部标签

C++ STL vector 迭代器与索引访问和线程安全

我正在迭代一个STLvector并从中读取值。还有另一个线程可以更改此vector。现在,如果另一个线程从vector中插入或删除元素,它会使迭代器无效。不使用涉及的锁。我选择通过索引(方法1)代替迭代器(方法2)访问容器是否使其线程安全?性能怎么样?structA{inti;intj;};方法一:size_ts=v.size();//vcontainspointerstoobjectsoftypeAfor(size_ti=0;ii++;}方法二:std::vector::iteratorbegin=v.begin();std::vector::iteratorend=v.end();

c++ - 在 STL 优先级队列 C++ 中实现 decreaseKey

我正在尝试实现Prim算法,为此我需要为优先级队列设置一个decreaseKey方法(以更新优先级队列中的键值)。我可以在STL优先级队列中实现它吗?如果有帮助,这是我正在遵循的算法:对于图G中的每个顶点u将u的键设置为INFINITY将你的父级设置为NIL将源顶点的键设置为0使用上述键将图中所有顶点入队到优先级队列Q当Q不为空时用Q中最低的键弹出顶点u对你的每个相邻顶点v做如果(v仍在Q中)和(key(u)+weight-function(u,v)设置你为v的父级将v的键更新为相等的键(u)+权重函数(u,v)//这部分给我带来了问题,因为我不知道如何在优先级队列中实现decreas

c++ - STL priority_queue<pair> 与 map

我需要一个优先级队列来存储每个键的值,而不仅仅是键。我认为可行的选择是std::multi_map因为它按键顺序迭代,或std::priority_queue>因为它在V之前在K上排序。除了个人偏好之外,我有什么理由更喜欢另一个吗?它们真的一样吗,还是我漏掉了什么? 最佳答案 优先级队列最初是在O(N)时间内排序的,然后以降序迭代所有元素需要O(NlogN)时间。它存储在std::vector中在幕后,所以在大O行为之后只有很小的系数。不过,其中一部分是在vector内部移动元素。如果sizeof(K)或sizeof(V)很大,会慢

c++ - C++ 中的分配器用法(STL 树)

我最近一直在尝试了解C++分配器的工作原理,并且一直在寻找STL库用于类似std::set之类的红黑树的实现。或std::map,但有些事情我无法理解。首先要做的是从容器必须存储的类型转换分配器-_Val-树使用的节点类型-_Rb_tree_node-使用重新绑定(bind)模板:typedeftypename__gnu_cxx::__alloc_traits::templaterebind>::other_Node_allocator;typedef__gnu_cxx::__alloc_traits_Alloc_traits;这个我可以解决。现在,当一个元素被插入并且它需要创建一个新

c++ - 如何通过索引递增的generate_n填充STL容器

要用依赖于索引的值填充STL容器,我通常会像下面的代码那样编写。有没有办法在不声明索引的情况下做同样的事情?intmain(){staticintN=10;autofunc=[](intidx){returnidx*(idx+1)+1;};intidx=-1;std::listlst;std::generate_n(std::back_inserter(lst),N,[&](){idx++;returnfunc(idx);});} 最佳答案 您可以将索引移动到lambda捕获中并使lambda像这样可变(需要C++14):std::

c++ - C++ STL中set的 'insert'函数的原理是什么?

对于下面这段代码:intmain(){std::sets;for(inti=0;ival当符号'structNode{intval;Node(int_val=-1):val(_val){}booloperatorp.val;}};当我把函数改成这样时:booloperator=p.val;}输出变为:'5443210'。差异让我感到困惑,有人可以解释为什么会发生这种情况并解释“插入”功能的原理吗? 最佳答案 std::set使用operator默认情况下在key类型上,因此在第一种情况下,它使用operator为Node定义比较键,

c++ - 带有自定义模板的 STL 迭代器

我有以下模板方法,templatevoidClass::setData(vectordata){vector::iteratorit;}我收到以下编译错误(XCode/gcc)error:expected`;'before'it'我发现其他人也有类似的问题here(readdowntoseeit'sthesameeventhoughitstartsoutwithadifferentissue)但他们似乎已经通过更新VisualStudio解决了。这让我猜测这是一个编译器问题,它应该编译,对吗?通过从0到size的索引进行迭代是可行的,但这不是我更愿意实现此功能的方式。还有另一种解决方法

c++ - 解锁对 STL vector::size 安全性的访问

我在STLvector上有几个作者(线程)和一个读者。正常的写入和读取是互斥保护的,但我想避免我拥有的循环上的争用,我想知道vector::size是否足够安全,我想这取决于实现,但因为通常vector动态内存是用于存储项目存储大小的内存不应在重新分配期间失效。我不介意有误报,在size>0之后,我实际上会锁定并再次检查,因此如果在另一个线程写入时读取size()不会出现段错误,它对我来说应该足够安全。 最佳答案 我不知道并发读取和写入整数段错误的实现(尽管C++03标准不禁止这样做,我不知道POSIX是否禁止)。如果vector使

c++ - Xcode STL C++调试编译报错

我有一些文件编写代码按预期工作,但在Debug模式下打印错误,在Release模式下没有输出错误。代码:#include#include#include#includeusingnamespacestd;intmain(intargc,char*constargv[]){stringcppfilename;std::cout调试输出:Pleaseenterthefilenametocreate:Running…myfileFileIO(5403)malloc:***errorforobject0xb3e8:pointerbeingfreedwasnotallocated***setab

c++ - STL priority_queue 复制比较器类

我正在尝试使用自定义比较器创建优先级队列:std::priority_queue,MyComparator>pq;我的问题是MyComparator有一个存储附加状态的方法。因为MyComparator被复制到优先级队列(据我所知),所以我无法在优先级队列持有的MyComparator实例上调用此方法。有没有办法:获得对优先级队列持有的MyComparator实例的访问权,或者:以某种方式通过引用传递原始MyComparator实例 最佳答案 STL容器中使用的比较对象以及STL算法中使用的谓词必须是可复制的对象和方法,算法可以随意